package Trab.ES1.Utilidades;
import Trab.ES1.Modelos.*;
import java.util.ArrayList;
import java.util.List;
/**
 *
 * @author Grupo H
 */
public class Fachada 
{
    private static Fachada fachada = null;
    private Criador criador = new Criador();
    private Destruidor destruidor = new Destruidor();
    private Verificador verificador = new Verificador();
    private Modificador modificador = new Modificador();
    private Buscador buscador = new Buscador();
    private Validador validador = new Validador();
    private Usuario usuarioLogado;
    
    private Fachada()
    {
    }
    
    public static Fachada getInstancia()
    {
        if(fachada == null)
        {
            fachada = new Fachada();
        }
        return fachada;
    }
        
    /* USUARIO */
    
    public void setUsuarioLogado(Usuario u)
    {
        this.usuarioLogado = u;
    }
    public Usuario getUsuarioLogado()
    {
        return usuarioLogado;
    }
    public boolean criaNovoUsuario(String login, String senha, String nomePublico)
    {
        return criador.criaNovoUsuario(login,senha,nomePublico);
    }
    
    public boolean verificaUnicidadeUsuario(String login)
    {
        return verificador.verificaUnicidadeUsuario(login);
    }
    
    public boolean validaUsuario(String login, String senha)
    {
        return validador.validaUsuario(login, senha);
    }
    
    public Usuario buscaUsuario(String login)
    {
        return buscador.buscaUsuario(login);
    }
    public void modificaSenha(String login)
    {
        Usuario u = buscaUsuario(login);
        modificador.modificaSenha(u);
    }
    public boolean verificaExistenciaUsuario(String login)
    {
        return !verificador.verificaUnicidadeUsuario(login);
    }
    
    /* GRUPO */
    
    public Grupo buscaGrupo(String nomeGrupo)
    {
        return buscador.buscaGrupo(nomeGrupo);
    }
    public boolean removeGrupo(Grupo g)
    {
        for(Usuario u: g.getAdministradoresDoGrupo())
            u.getGruposNoQualEDono().remove(g);
        for(Usuario u: g.getUsuariosDoGrupo())
            u.getGruposPertencentes().remove(g);
        return destruidor.removeGrupo(g);
    }
    public boolean verificaUnicidadeGrupo(String nomeGrupo)
    {
        return verificador.verificaUnicidadeGrupo(nomeGrupo);
    }
    public boolean criaNovoGrupo(String nomeGrupo, String descricaoGrupo, Usuario dono)
    {
        boolean retorno = criador.criaNovoGrupo(nomeGrupo, descricaoGrupo, dono);
        Grupo g = buscador.buscaGrupo(nomeGrupo);
        if(g != null)
        {
            dono.getGruposPertencentes().add(g);
            dono.getGruposNoQualEDono().add(g);
        }
        return retorno;
    }
    
    /* RECEITA */
    
    public List<Receita> buscaReceitas(List<String> stringIngredientes)
    {
        List<Ingrediente> ingredientes = new ArrayList<>();
        for(String s: stringIngredientes)
            ingredientes.add(new Ingrediente(s));
        return buscador.buscaReceitas(ingredientes);
    }        
    public Ingrediente buscaIngrediente(String nomeIngrediente)
    {
        return buscador.buscaIngrediente(nomeIngrediente);
    }
    public Ingrediente criaIngrediente(String nomeIngrediente)
    {
        Ingrediente i = buscador.buscaIngrediente(nomeIngrediente);
        if(i == null)
        {
            criador.criaNovoIngrediente(nomeIngrediente);
            i = buscador.buscaIngrediente(nomeIngrediente);
        }
        return i;
    }        
    public boolean removeReceita(Receita r)
    {
        r.getAutor().getReceitasEscritas().remove(r);
        for(Usuario u: MiojoNao.getInstancia().getUsuarios())
            u.getReceitasFavoritas().remove(r);
        return destruidor.removeReceita(r);
    }
    public boolean verificaUnicidadeReceita(String nomeReceita)
    {
        return verificador.verificaUnicidadeReceita(nomeReceita);
    }
    public void adicionaCategoria(Receita r, String nomeCategoria)
    {
        r.getCategorias().add(new Categoria(nomeCategoria));
    }
    public void adicionaIngrediente(Receita r, String nomeIngrediente, String qtd)
    {
        Ingrediente i = new Ingrediente(nomeIngrediente);
        r.getIngredientes().add(i);
        r.getQuantidadeIngredientes().add(new QuantidadeIngrediente(i, r, qtd));
    }
    public boolean criaNovaReceita(String nomeReceita, String descricaoReceita, Usuario autor, int tempoPreparo)
    {
        return criador.criaNovaReceita(nomeReceita, descricaoReceita, autor, tempoPreparo);
    }
    public Receita buscaReceita(String nomeReceita)
    {
        return buscador.buscaReceita(nomeReceita);
    }
    public void avaliaNotaReceita(Receita r, float nota)
    {
        r.setNota(nota);
    }
    public void avaliaDificuldadeReceita(Receita r, float dificuldade)
    {
        r.setDificuldade(dificuldade);
    }
    public void favoritaReceita(Receita r, Usuario u)
    {
        u.getReceitasFavoritas().add(r);
    }
    
    /* CATEGORIA */
    
    public boolean verificaUnicidadeCategoria(String nomeCategoria)
    {
        return verificador.verificaUnicidadeCategoria(nomeCategoria);
    }    
    public Categoria buscaCategoria(String nomeCategoria)
    {
        return buscador.buscaCategoria(nomeCategoria);
    }
    public boolean criaNovaCategoria(String nomeCategoria)
    {
        return criador.criaNovaCategoria(nomeCategoria);
    }
    public Categoria criaCategoria(String nomeCategoria)
    {
        Categoria c = buscador.buscaCategoria(nomeCategoria);
        if(c == null)
        {
            criador.criaNovaCategoria(nomeCategoria);
            c = buscador.buscaCategoria(nomeCategoria);
        }
        return c;
    }
    
    /* INGREDIENTE */
    
    public boolean verificaUnicidadeIngrediente(String nomeIngrediente)
    {
        return verificador.verificaUnicidadeIngrediente(nomeIngrediente);
    }
    public boolean criaNovoIngrediente(String nomeIngrediente)
    {
        return criador.criaNovoIngrediente(nomeIngrediente);
    }
    
    /* COMENTARIO */
    
    public Comentario criaNovoComentario(String texto, Usuario autor)
    {
        return criador.criaNovoComentario(texto, autor);
    }
}
